package com.qf.realm;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.SimpleAccountRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Test;

public class SimpleRealmTest {


    @Test
    public void simple(){
//        1. 创建SimpleRealm对象.
        SimpleAccountRealm realm = new SimpleAccountRealm();
//                设置用户名和密码,以及相应的角色.
        realm.addAccount("admin","admin","超级管理员","普通用户");

//        2. 创建SecurityManager对象.
        DefaultSecurityManager securityManager = new DefaultSecurityManager();
//                给SecurityManager对象设置创建好的realm.
        securityManager.setRealm(realm);

//        3. 创建Subject主体.
//                给工具设置上SecurityManager对象.
        SecurityUtils.setSecurityManager(securityManager);
//                再由工具创建Subject.
        Subject subject = SecurityUtils.getSubject();


//        4. 由主体发起认证请求.
        subject.login(new UsernamePasswordToken("admin","admin"));

//        5. 判断认证书否成功
        if(subject.isAuthenticated()){
            System.out.println("登录成功!!");
        }


        //如果用户名错误: shiro会抛出 UnknowAccountExceptipn
        //如果密码错误: shiro会抛出 IncorrectCredentialsException
        //                           in可ruai可特,可蛋寿司

        // 授权操作的前提,你已经认证过了.
//        6. 授权操作
        if(subject.hasRole("超级管理员")){
            System.out.println("拥有超级管理员!!");
        }
        // 多个角色是用and连接的.
        // 没有指定角色时,会抛出异常.   UnauthorizedException
        subject.checkRoles("超级管理员");
    }
}
